package com.cfjjc.gz.usraccount.service;

import java.util.List;

import org.apache.log4j.Logger;

import com.cfjjc.gz.common.consts.SystemConst;
import com.cfjjc.gz.common.consts.TradeInfoConst;
import com.cfjjc.gz.common.consts.TypeValueConst;
import com.cfjjc.gz.common.dao.DefaultDAO;
import com.cfjjc.gz.common.exception.OTSException;
import com.cfjjc.gz.common.service.BaseService;
import com.cfjjc.gz.common.util.DateTimeUtil;
import com.cfjjc.gz.common.util.IDCard;
import com.cfjjc.gz.common.util.StringUtil;
import com.cfjjc.gz.common.util.RandomGUID;
import com.cfjjc.gz.common.util.paged.PagedList;

import com.cfjjc.gz.usraccount.vo.A_ORGVO;
import com.cfjjc.gz.usraccount.vo.A_USRVO;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 
 * 说明：机构信息表 业务逻辑层对象
 * 
 * @author liuxun
 * @since 2012-03-06
 * @version 1.0
 */
@Service
@Transactional(rollbackFor = Throwable.class)
public class A_ORGService extends BaseService {

	/**
	 * logger对象
	 */
	private static final Logger logger = Logger.getLogger(A_ORGService.class);

	@Autowired
	private DefaultDAO dao;

	// 要访问的dao的命名空间
	private String namespace = "A_ORG";

	public A_ORGService() {
		super();
	}

	/**
	 * 仅查询单条机构信息表的详细信息
	 */
	public A_ORGVO queryA_ORG(A_ORGVO param) throws OTSException {
		return (A_ORGVO) dao.queryObject(param, this.namespace);
	}

	/**
	 * 根据条件检索机构信息表，返回分页结果
	 */
	public void queryA_ORGs(A_ORGVO param, PagedList records)
			throws OTSException {
		dao.queryPagedList(param, records, this.namespace);
	}

	/**
	 * 根据条件检索机构信息表，返回所有结果
	 */
	public List<A_ORGVO> queryA_ORGList(A_ORGVO param) throws OTSException {
		return dao.queryList(param, this.namespace);
	}

	/**
	 * 增加机构信息表
	 */
	public void doInsertA_ORG(A_ORGVO param) throws OTSException {

		param.setKey(RandomGUID.getRandomGuid());
		param.setIs_hide(SystemConst.NO_CONST);
		param.setNode_id(SystemConst.NODE_ID); // TODO 临时写死
		param.setCreate_at(DateTimeUtil.getDateTime());
		String org_sequence = "";
		org_sequence = param.getOrg_sequence();
		if(org_sequence==null)
		{
		 param.setOrg_sequence("100" + "" + param.getOrg_code());
		}
		else
		{
		param.setOrg_sequence(org_sequence);
		}
		param.setOrg_status("01");
		
		
		A_ORGVO queryValidataUpper = new A_ORGVO();
		queryValidataUpper.setOrg_code(param.getUpper_org_code());
	 
		A_ORGVO resUpper = this.queryA_ORG(queryValidataUpper);	
		
		if (resUpper == null) {
			throw new OTSException("没有这个：" + param.getUpper_org_code() + " 介绍人!");
		}

		// 录入前的校验
		_checkFields(param, SystemConst.OPERATION_TYPE_NEW);

		// 校验机构代码是否重复
		A_ORGVO query = new A_ORGVO();
		query.setOrg_code(param.getOrg_code());
		query.setOrg_status(TypeValueConst.ORG_STATUS_DELETE);
		query.setContainsDeleted(SystemConst.NO_CONST);
		
		A_ORGVO res = this.queryA_ORG(query);		

		if (res != null) {
			throw new OTSException("当前身份证号：" + param.getOrg_code() + " 已存在!");
			
		}
		
		if (IDCard.IDCardValidate(param.getOrg_code()).equals("2")) {
			throw new OTSException("当前身份证号：" + param.getOrg_code() + " 不是正确的身份证号，请输入真实的身份证号!");
			
		}
		

		dao.insert(param, this.namespace);
		if (logger.isDebugEnabled()) {
			logger.debug("增加一条机构信息表记录:" + param);
		}
		
		// 记录操作日志
	//	insertTradeLog(TradeInfoConst.TRADE_ADD_ORG, param.getOrg_name(), param);
		
		// 更新上级机构为非底级机构
		if (StringUtil.isNotEmpty(param.getUpper_org_code())) {
			A_ORGVO query_upper = new A_ORGVO();
			query_upper.setOrg_code(param.getUpper_org_code());
			A_ORGVO res_upper = queryA_ORG(query_upper);

			if (res_upper != null) {
				A_ORGVO update_upper = new A_ORGVO();
				update_upper.setOrg_id(res_upper.getOrg_id());
				update_upper.setIs_leaf(SystemConst.NO_CONST);
				dao.update(update_upper, this.namespace);
			}
		}
	}

	/**
	 * 修改机构信息表
	 */
	public void doUpdateA_ORG(A_ORGVO param) throws OTSException {

		A_ORGVO query = new A_ORGVO();
		query.setOrg_id(param.getOrg_id());
		System.out.println("orgid:"+param.getOrg_id());
		A_ORGVO res = (A_ORGVO) this.queryA_ORG(query);

		if (res == null) {
			throw new OTSException("要操作的记录不存在,请刷新页面后重试或联系管理员！");
		}
		param.setUpdate_at(DateTimeUtil.getDateTime());
		
		if(param.getOrg_status()==null||param.getOrg_status().equals(""))
		{
		   param.setOrg_status("01");
		}
		// 修改前的校验
		_checkFields(param, SystemConst.OPERATION_TYPE_MODIFY);
		dao.update(param, this.namespace);
		if (logger.isDebugEnabled()) {
			logger.debug("修改机构信息表:" + param);
		}
		
		// 记录操作日志
	//	insertTradeLog(TradeInfoConst.TRADE_MODIFY_ORG, param.getOrg_name(), param);
	}

	/**
	 * 删除机构信息表
	 */
	public void doDeleteA_ORG(A_ORGVO param) throws OTSException {
		// 删除前的校验
		_checkFields(param, SystemConst.OPERATION_TYPE_DELETE);

		A_ORGVO query = new A_ORGVO();
		query.setOrg_id(param.getOrg_id());
		A_ORGVO res = queryA_ORG(query);

		if (res == null) {
			throw new OTSException("要操作的记录不存在,请刷新页面后重试或联系管理员!");
		}

		if (SystemConst.NO_CONST.equals(res.getIs_leaf())) {
			throw new OTSException("该机构不是底级机构，不能删除!");
		}

		// 若机构下存在用户，不能删除该机构
		String org_id = res.getOrg_id();
		A_USRVO queryUsr = new A_USRVO();
		queryUsr.setOrg_id(org_id);
		queryUsr.setContainsDeleted(SystemConst.NO_CONST);
		queryUsr.setUsr_status(TypeValueConst.USR_STATUS_LOGOUT);
		List rsUsr = (List) dao.queryList(queryUsr, "A_USR");

		if (!rsUsr.isEmpty()) {
			throw new OTSException("当前机构下存在用户，不能删除该机构！");
		}

		res.setOrg_status(TypeValueConst.ORG_STATUS_DELETE);
		res.setUpdate_by(param.getUpdate_by());
		res.setUpdate_at(DateTimeUtil.getDateTime());
		dao.update(res, this.namespace);
		if (logger.isDebugEnabled()) {
			logger.debug("删除机构信息表:" + res);
		}

		// 记录操作日志
	//	insertTradeLog(TradeInfoConst.TRADE_DEL_ORG, res.getOrg_name(), res);
		
		// 判断删除的机构的上级机构是否有下级机构， 若无下级机构，则更新上级机构为底级机构
		A_ORGVO query_children_count = new A_ORGVO();
		query_children_count.setUpper_org_code(res.getUpper_org_code());
		query_children_count.setOrg_status(TypeValueConst.ORG_STATUS_DELETE);
		query_children_count.setContainsDeleted(SystemConst.NO_CONST);
		int count = (Integer) this.dao.queryObject(query_children_count,
				this.namespace, DefaultDAO.QUERY_COUNT_NAME);

		if (count == 0) {
			A_ORGVO query_upper = new A_ORGVO();
			query_upper.setOrg_code(res.getUpper_org_code());
			A_ORGVO res_upper = queryA_ORG(query_upper);

			A_ORGVO update_upper = new A_ORGVO();
			update_upper.setOrg_id(res_upper.getOrg_id());
			update_upper.setIs_leaf(SystemConst.YES_CONST);
			this.dao.update(update_upper, this.namespace);
		}
		
	}

	/** 以下为私有方法.私有方法应以下划线"_"开头 */
	/**
	 * 对当前的操作对象进行字段级的校验<br>
	 * 
	 * @param param
	 *            待操作的vo对象
	 * @param opeType
	 *            操作类型,见SystemConst中定义的常数
	 * 
	 * @see com.mofit.fs.yhbs.common.SystemConst
	 */
	private void _checkFields(A_ORGVO param, int opeType) throws OTSException {
		if (logger.isDebugEnabled()) {
			logger.debug("对待保存的对象进行字段校验,操作类型opeType=" + opeType);
		}
		/*
		 * 除操作类型为insert外,主键字段不能为空
		 */
		if (opeType != SystemConst.OPERATION_TYPE_NEW) {

			if (param.getOrg_id() == null
					|| "".equals(String.valueOf(param.getOrg_id()))) {
				throw new OTSException("机构ID不能为空！");
			}

		}
		/*
		 * 对于操作类型为insert,非主键字段中不允许null的字段不能为空
		 */
		if (opeType == SystemConst.OPERATION_TYPE_NEW || opeType == SystemConst.OPERATION_TYPE_MODIFY) {

			if (param.getOrg_code() == null
					|| "".equals(String.valueOf(param.getOrg_code()))) {
				throw new OTSException("机构代码不能为空！");
			}

			if (param.getOrg_name() == null
					|| "".equals(String.valueOf(param.getOrg_name()))) {
				throw new OTSException("机构名称不能为空！");
			}

			if (param.getUpper_org_code() == null
					|| "".equals(String.valueOf(param.getUpper_org_code()))) {
				throw new OTSException("上级机构代码不能为空！");
			}

			System.out.println("getIs_leaf:"+param.getIs_leaf());
			
			if (param.getIs_leaf() == null
					|| "".equals(String.valueOf(param.getIs_leaf()))) {
				System.out.println("getIs_leaf is null,getIs_leaf set 1");
				param.setIs_leaf("1");
			//	throw new OTSException("是否底级不能为空！");
			}

			if (param.getIs_hide() == null
					|| "".equals(String.valueOf(param.getIs_hide()))) {
				throw new OTSException("机构是否隐藏不能为空！");
			}

			if (param.getOrg_status() == null
					|| "".equals(String.valueOf(param.getOrg_status()))) {
				throw new OTSException("机构状态不能为空！");
			}

			if (param.getNode_id() == null
					|| "".equals(String.valueOf(param.getNode_id()))) {
				throw new OTSException("节点ID不能为空！");
			}

		}

		/*
		 * 对于操作类型为insert或update,字段长度不能超过表中字段长度
		 */
		if (opeType == SystemConst.OPERATION_TYPE_NEW
				|| opeType == SystemConst.OPERATION_TYPE_MODIFY) {

			if (StringUtil.getLength(param.getOrg_code()) > 50) {
				throw new OTSException("机构代码内容长度不能大于50位,请检查！");
			}

			if (StringUtil.getLength(param.getOrg_name()) > 150) {
				throw new OTSException("机构名称内容长度不能大于150位,请检查！");
			}

			if (StringUtil.getLength(param.getUpper_org_code()) > 50) {
				throw new OTSException("上级机构代码内容长度不能大于50位,请检查！");
			}

			if (StringUtil.getLength(param.getIs_leaf()) > 1) {
				throw new OTSException("是否底级内容长度不能大于1位,请检查！");
			}

			if (StringUtil.getLength(param.getOrg_desc()) > 255) {
				throw new OTSException("描述内容长度不能大于255位,请检查！");
			}

			if (StringUtil.getLength(param.getOrg_order()) > 50) {
				throw new OTSException("机构排序内容长度不能大于50位,请检查！");
			}

			if (StringUtil.getLength(param.getIs_hide()) > 1) {
				throw new OTSException("机构是否隐藏内容长度不能大于1位,请检查！");
			}

			if (StringUtil.getLength(param.getZone_short_name()) > 50) {
				throw new OTSException("地域简称内容长度不能大于50位,请检查！");
			}

			if (StringUtil.getLength(param.getOrg_status()) > 50) {
				throw new OTSException("机构状态内容长度不能大于50位,请检查！");
			}

			if (StringUtil.getLength(param.getNode_id()) > 50) {
				throw new OTSException("节点ID内容长度不能大于50位,请检查！");
			}

		}

		if (logger.isDebugEnabled()) {
			logger.debug("字段校验通过");
		}
	}
}